// Listing 15.1 static data members
#include <iostream>
using namespace std;

class Cat {
public:
  Cat(int age): itsAge(age) { HowManyCats++; }
  virtual ~Cat() { HowManyCats--; }
  virtual int GetAge() const { return itsAge; }
  virtual void SetAge(int age) { itsAge = age; }
  static int HowManyCats;
private:
  int itsAge;    
};

int Cat::HowManyCats = 0;
int main(void) {
  const int MaxCats = 5;
  int i;
  Cat *CatHouse[MaxCats];
  for(i = 0; i < MaxCats; i++) {
    CatHouse[i] = new Cat(i);
  }
  for(i = 0; i < MaxCats; i++) {
    cout << "There are ";
    cout << Cat::HowManyCats;
    cout << " cats left:" << endl;
    cout << "Deleting the one that is ";
    cout << CatHouse[i]->GetAge();
    cout << " years old" << endl;
    delete CatHouse[i];
    CatHouse[i] = 0;
  }
  return 0; 
}